package com.example.springboottest.example.charset;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * Java采用unicode来表示字符，java中的一个char是2个字节，一个中文或英文字符的unicode编码都占2个字节，但如果采用其他编码方式，一个字符占用的字节数则各不相同。
 * <p>
 * 在 GB 2312 编码或 GBK 编码中，一个英文字母字符存储需要1个字节，一个汉子字符存储需要2个字节。
 * <p>
 * 在UTF-8编码中，一个英文字母字符存储需要1个字节，一个汉字字符储存需要3到4个字节。
 * <p>
 * 在UTF-16编码中，一个英文字母字符存储需要2个字节，一个汉字字符储存需要3到4个字节（Unicode扩展区的一些汉字存储需要4个字节）。
 * <p>
 * 在UTF-32编码中，世界上任何字符的存储都需要4个字节。
 */
public class JavaCharTest {
    public static void main(String[] args) {
        String str = "方";
        char _char = '方';

        System.out.println("str.length()：" + str.length()); //这个求的是字符长度，不是字节长度！！


        System.out.println("java默认的字符编码是：" + Charset.defaultCharset());
        System.out.println("str在UTF_16的字节编码长度：" + str.getBytes(StandardCharsets.UTF_16).length);
        System.out.println("str在默认（UTF-8）编码下的字节长度：" + str.getBytes().length);
        System.out.println("str在utf-8编码下的字节长度：" + str.getBytes(StandardCharsets.UTF_8).length);
        System.out.println("_char.length()：" + char2Byte(_char).length);
        System.out.println("*************************");

        String str2 = "a";
        char _char2 = 'a';

        System.out.println("str2.length()：" + str2.length()); //这个求的是字符长度，不是字节长度！！

        System.out.println("str2在UTF_16的字节编码长度：" + str2.getBytes(StandardCharsets.UTF_16).length);
        System.out.println("str2在默认（UTF-8）编码下的字节长度：" + str2.getBytes().length);
        System.out.println("str2在utf-8编码下的字节长度：" + str2.getBytes(StandardCharsets.UTF_8).length);
        System.out.println("_char2.length()：" + char2Byte(_char2).length);
    }

    public static byte[] char2Byte(char c) {
        byte[] b = new byte[2];
        b[0] = (byte) ((c & 0xFF00) >> 8);
        b[1] = (byte) (c & 0xFF);
        return b;
    }
}
